package Veterinaria.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import Veterinaria.excepcion.CodigoDuplicadoExcepcion;
import Veterinaria.excepcion.DAOExcepcion;
import Veterinaria.excepcion.ValidaApellidoExcepcion;
import Veterinaria.excepcion.ValidaNombreExcepcion;
import Veterinaria.modelo.Factura;
import Veterinaria.modelo.ListaCitaPacienteDoctorxDueno;
import Veterinaria.modelo.Persona;
import Veterinaria.modelo.Doctor;
import Veterinaria.modelo.Dueno;
import Veterinaria.util.ConexionBD;
import Veterinaria.dao.BaseDAO;

public class PersonaDAO extends BaseDAO {

	private boolean NoExistePersona(String codigo) throws DAOExcepcion {
		return obtenerPersona(codigo) == null;
	}

	public Dueno insertarDueno(Dueno vo) throws DAOExcepcion,
			CodigoDuplicadoExcepcion, ValidaNombreExcepcion,
			ValidaApellidoExcepcion {
		String query = "insert into Persona(idpersona, nombre, apellido, tipo, mail,"
				+ "direccion, telefono, celular, sexo, ruc, estado)"
				+ " values (?,?,?,?,?,?,?,?,?,?,?)";
		String query1 = "insert into dueno(iddueno, imagen, notas) values (?,?,?)";

		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;

		if (NoExistePersona(vo.getCodigo_persona())) {
			if (vo.getNombre_persona().isEmpty()) {
				throw new ValidaNombreExcepcion();
			} else {
				if (vo.getApellido_persona().isEmpty()) {
					throw new ValidaApellidoExcepcion();
				} else {

					try {
						con = ConexionBD.obtenerConexion();
						stmt = con.prepareStatement(query);
						stmt.setString(1, vo.getCodigo_persona());
						stmt.setString(2, vo.getNombre_persona());
						stmt.setString(3, vo.getApellido_persona());
						stmt.setString(4, vo.getTipo_persona());
						stmt.setString(5, vo.getEmail_persona());
						stmt.setString(6, vo.getDireccion());
						stmt.setString(7, vo.getTelefono_fijo());
						stmt.setString(8, vo.getTelefono_celular());
						stmt.setString(9, vo.getSexo());
						stmt.setString(10, vo.getRuc());
						stmt.setString(11, vo.getEstado());

						int i = stmt.executeUpdate();
						if (i != 1) {
							throw new SQLException("No se pudo insertar");
						}

						stmt = con.prepareStatement(query1);
						stmt.setString(1, vo.getCodigo_persona());
						stmt.setString(2, vo.getImagen());
						stmt.setString(3, vo.getNotas());

						int x = stmt.executeUpdate();
						if (x != 1) {
							throw new SQLException("No se pudo insertar");
						}

					} catch (SQLException e) {
						System.err.println(e.getMessage());
						throw new DAOExcepcion(e.getMessage());
					} finally {
						this.cerrarResultSet(rs);
						this.cerrarStatement(stmt);
						this.cerrarConexion(con);
					}
				}
			}
		} else
			throw new CodigoDuplicadoExcepcion(vo.getCodigo_persona());
		return vo;
	}

	public Doctor insertarDoctor(Doctor vo) throws DAOExcepcion,
			CodigoDuplicadoExcepcion {

		String query = "insert into Persona(idpersona, nombre, apellido, tipo, mail,"
				+ "direccion, telefono, celular, sexo, ruc, estado)"
				+ " values (?,?,?,?,?,?,?,?,?,?,?)";

		String query1 = "insert into doctor(iddoctor, usuariosistema,password) values (?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;

		if (NoExistePersona(vo.getCodigo_persona())) {

			try {
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setString(1, vo.getCodigo_persona());
				stmt.setString(2, vo.getNombre_persona());
				stmt.setString(3, vo.getApellido_persona());
				stmt.setString(4, vo.getTipo_persona());
				stmt.setString(5, vo.getEmail_persona());
				stmt.setString(6, vo.getDireccion());
				stmt.setString(7, vo.getTelefono_fijo());
				stmt.setString(8, vo.getTelefono_celular());
				stmt.setString(9, vo.getSexo());
				stmt.setString(10, vo.getRuc());
				stmt.setString(11, vo.getEstado());
				

				int i = stmt.executeUpdate();
				if (i != 1) {
					throw new SQLException("No se pudo insertar");
				}

				stmt = con.prepareStatement(query1);
				stmt.setString(1, vo.getCodigo_persona());
				stmt.setString(2, vo.getUsuario_sistema());
				stmt.setString(3, vo.getPassword());

				int x = stmt.executeUpdate();
				if (x != 1) {
					throw new SQLException("No se pudo insertar");
				}

			} catch (SQLException e) {
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
			} finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);

			}
		} else
			throw new CodigoDuplicadoExcepcion(vo.getCodigo_persona());

		return vo;
	}

	public Persona obtener(String codigo_persona) throws DAOExcepcion {
		Persona vo = new Persona();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select idpersona, nombre, apellido, tipo, mail,"
					+ "direccion, telefono, celular, sexo, ruc, estado"
					+ " from persona where idpersona=" + "'" + codigo_persona
					+ "'";

			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			// stmt.setString(1, codigo_persona);
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setCodigo_persona(rs.getString(1));
				vo.setNombre_persona(rs.getString(2));
				vo.setApellido_persona(rs.getString(3));
				vo.setTipo_persona(rs.getString(4));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public Doctor obtenerDoctor(String codigo_persona) throws DAOExcepcion {
		Doctor vo = new Doctor();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select a.iddoctor,b.nombre, b.apellido, a.usuariosistema from doctor as a join persona as b on b.idpersona = a.iddoctor  where  iddoctor="
					+ "'" + codigo_persona + "'";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			// stmt.setString(1, codigo_persona);
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setCodigo_persona(rs.getString(1));
				vo.setNombre_persona(rs.getString(2));
				vo.setApellido_persona(rs.getString(3));
				vo.setUsuario_sistema(rs.getString(4));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public Dueno obtenerDueno(String codigo_persona) throws DAOExcepcion {
		Dueno vo = new Dueno();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select a.iddueno, b.nombre, b.apellido, a.imagen, a.notas from dueno as a join persona as b on b.idpersona = a.iddueno where iddueno="
					+ "'" + codigo_persona + "'";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			// stmt.setString(1, codigo_persona);
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setCodigo_persona(rs.getString(1));
				vo.setNombre_persona(rs.getString(2));
				vo.setApellido_persona(rs.getString(3));
				vo.setImagen(rs.getString(4));
				vo.setNotas(rs.getString(5));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public void Eliminar(String idpersona) throws DAOExcepcion {
		String query = "update persona set estado='0' where idpersona=?";

		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, idpersona);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	// public void EliminarDueno(String iddueno) throws DAOExcepcion{
	// String query = "delete from dueno WHERE iddueno=?";
	// String query1 = "delete from persona WHERE idpersona=?";
	// Connection con = null;
	// PreparedStatement stmt = null;
	// try {
	// con = ConexionBD.obtenerConexion();
	// stmt = con.prepareStatement(query);
	// stmt.setString(1, iddueno);
	// int i = stmt.executeUpdate();
	// if (i != 1) {
	// throw new SQLException("No se pudo eliminar");
	// }
	//
	// stmt = con.prepareStatement(query1);
	// stmt.setString(1, iddueno);
	// int x = stmt.executeUpdate();
	// if (x != 1) {
	// throw new SQLException("No se pudo eliminar");
	// }
	//
	// }catch (SQLException e) {
	// System.err.println(e.getMessage());
	// throw new DAOExcepcion(e.getMessage());
	// } finally {
	// this.cerrarStatement(stmt);
	// this.cerrarConexion(con);
	// }
	// }
	public Doctor actualizarDoctor(Doctor vo) throws DAOExcepcion {
		String query = "update persona set nombre=?, apellido=?, tipo=?, mail=?,"
				+ "direccion=?, telefono=?, celular=?, sexo=?, ruc=?, estado=? where idpersona=?";
		String query1 = "update doctor set usuariosistema=?, password=? where iddoctor=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getNombre_persona());
			stmt.setString(2, vo.getApellido_persona());
			stmt.setString(3, vo.getTipo_persona());
			stmt.setString(4, vo.getEmail_persona());
			stmt.setString(5, vo.getDireccion());
			stmt.setString(6, vo.getTelefono_fijo());
			stmt.setString(7, vo.getTelefono_celular());
			stmt.setString(8, vo.getSexo());
			stmt.setString(9, vo.getRuc());
			stmt.setString(10, vo.getEstado());
			stmt.setString(11, vo.getCodigo_persona());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
			stmt = con.prepareStatement(query1);
			stmt.setString(01, vo.getUsuario_sistema());
			stmt.setString(02, vo.getPassword());
			stmt.setString(03, vo.getCodigo_persona());
			
			int x = stmt.executeUpdate();
			if (x != 1) {
				throw new SQLException("No se pudo actualizar");
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public Dueno actualizarDueno(Dueno vo) throws DAOExcepcion {
		String query = "update persona set nombre=?, apellido=?, tipo=?, mail=?,"
				+ "direccion=?, telefono=?, celular=?, sexo=?, ruc=?, estado=? where idpersona=?";
		String query1 = "update dueno set imagen=?, notas=? where iddueno=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getNombre_persona());
			stmt.setString(2, vo.getApellido_persona());
			stmt.setString(3, vo.getTipo_persona());
			stmt.setString(4, vo.getEmail_persona());
			stmt.setString(5, vo.getDireccion());
			stmt.setString(6, vo.getTelefono_fijo());
			stmt.setString(7, vo.getTelefono_celular());
			stmt.setString(8, vo.getSexo());
			stmt.setString(9, vo.getRuc());
			stmt.setString(10, vo.getEstado());
			stmt.setString(11, vo.getCodigo_persona());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
			stmt = con.prepareStatement(query1);
			stmt.setString(01, vo.getImagen());
			stmt.setString(02, vo.getNotas());
			stmt.setString(03, vo.getCodigo_persona());
			int x = stmt.executeUpdate();
			if (x != 1) {
				throw new SQLException("No se pudo actualizar");
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public Collection<Doctor> listar() throws DAOExcepcion {
		Collection<Doctor> p = new ArrayList<Doctor>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select * from persona p inner join doctor d on d.iddoctor=p.idpersona order by p.nombre";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Doctor vo = new Doctor();
				vo.setCodigo_persona(rs.getString("idpersona"));
				vo.setNombre_persona(rs.getString("nombre"));
				p.add(vo);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return p;
	}

	public Collection<Factura> listarfacturasdueno(String iddueno)
			throws DAOExcepcion {
		String query = "select f.idfactura, f.fecfatura, f.total "
				+ "from factura f "
				+ "INNER JOIN dueno d on d.iddueno=f.iddueno "
				+ "INNER JOIN persona p on d.iddueno=p.idpersona "
				+ "where p.estado=1 and f.estado=1 and d.iddueno=? ";

		Collection<Factura> lista = new ArrayList<Factura>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, iddueno);
			rs = stmt.executeQuery();
			while (rs.next()) {

				Factura vo = new Factura();
				vo.setCod_factura(rs.getString("f.idfactura"));
				vo.setFecha_factura(rs.getString("f.fecfatura"));
				vo.setTotal(rs.getDouble("f.total"));

				lista.add(vo);

			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		System.out.println(lista.size());
		return lista;
	}

	public Collection<ListaCitaPacienteDoctorxDueno> listarHistorialCitaxDueno(
			String iddueno) throws DAOExcepcion {
		Collection<ListaCitaPacienteDoctorxDueno> l = new ArrayList<ListaCitaPacienteDoctorxDueno>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select cita.idcita, paciente.idpaciente, paciente.nombre, doctor.iddoctor, a.nombre, cita.direccion, cita.tipocita, cita.feccita, cita.hora "
					+ "from cita join paciente "
					+ "on paciente.idpaciente = cita.idpaciente "
					+ "join doctor on doctor.iddoctor = cita.iddoctor "
					+ "join persona as a on a.idpersona = doctor.iddoctor "
					+ "Where paciente.iddueno =?";

			stmt = con.prepareStatement(query);
			stmt.setString(1, iddueno);
			rs = stmt.executeQuery();
			while (rs.next()) {
				ListaCitaPacienteDoctorxDueno vo = new ListaCitaPacienteDoctorxDueno();
				vo.setIdcita(rs.getString("cita.idcita"));
				vo.setIdpaciente(rs.getString("paciente.idpaciente"));
				vo.setNombrepaciente(rs.getString("paciente.nombre"));
				vo.setIddoctor(rs.getString("doctor.iddoctor"));
				vo.setNombredoctor(rs.getString("a.nombre"));
				vo.setDireccion(rs.getString("cita.direccion"));
				vo.setTipocita(rs.getString("cita.tipocita"));
				vo.setFeccita(rs.getString("cita.feccita"));
				vo.setHora(rs.getString("cita.hora"));
				l.add(vo);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return l;
	}

	public Persona obtenerPersona(String codigo_persona) throws DAOExcepcion {
		Persona vo = new Persona();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select idpersona, nombre, apellido, tipo, mail,"
					+ "direccion, telefono, celular, sexo, ruc, estado"
					+ " from persona where idpersona=" + "'" + codigo_persona
					+ "'";

			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			// stmt.setString(1, codigo_persona);
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setCodigo_persona(rs.getString(1));
				vo.setNombre_persona(rs.getString(2));
				vo.setApellido_persona(rs.getString(3));
				vo.setTipo_persona(rs.getString(4));
				return vo;
			} else
				return null;
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}

	}

public Collection<Dueno> ListaDuenoXNombre(String nombre)
			throws DAOExcepcion {
		Collection<Dueno> l = new ArrayList<Dueno>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			nombre = '%' + nombre + '%';
			String query = "select p.idpersona, p.nombre, p.apellido, p.tipo, p.mail, p.direccion, p.telefono, p.celular, p.sexo, p.ruc, p.estado, d.imagen, d.notas "
					+ "from persona as p join dueno as d "
					+ "on d.iddueno = p.idpersona " + "Where p.estado=1 and p.apellido like ?";

			stmt = con.prepareStatement(query);
			stmt.setString(1, nombre);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Dueno vo = new Dueno();
				vo.setCodigo_persona(rs.getString("p.idpersona"));
				vo.setNombre_persona(rs.getString("p.nombre"));
				vo.setApellido_persona(rs.getString("p.apellido"));
				vo.setTipo_persona(rs.getString("p.tipo"));
				vo.setEmail_persona(rs.getString("p.mail"));
				vo.setDireccion(rs.getString("p.direccion"));
				vo.setTelefono_fijo(rs.getString("p.telefono"));
				vo.setTelefono_celular(rs.getString("p.celular"));
				vo.setSexo(rs.getString("p.sexo"));
				vo.setRuc(rs.getString("p.ruc"));
				vo.setEstado(rs.getString("p.estado"));
				vo.setImagen(rs.getString("d.imagen"));
				vo.setNotas(rs.getString("d.notas"));
				l.add(vo);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return l;
	}

public Collection<Doctor> ListaDoctorXNombre(String nombre) throws DAOExcepcion {
		Collection<Doctor> l = new ArrayList<Doctor>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			nombre = '%'+nombre+'%';
			String query = "select p.idpersona, p.nombre, p.apellido, p.tipo, p.mail, p.direccion, p.telefono, p.celular, p.sexo, p.ruc, p.estado, d.usuariosistema, d.password "
					+ "from persona as p join doctor as d "
					+ "on d.iddoctor = p.idpersona "
					+ "Where p.estado = '1' and p.apellido like ?";

			stmt = con.prepareStatement(query);
			stmt.setString(1, nombre);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Doctor vo = new Doctor();
				vo.setCodigo_persona(rs.getString("p.idpersona"));
				vo.setNombre_persona(rs.getString("p.nombre"));
				vo.setApellido_persona(rs.getString("p.apellido"));
				vo.setTipo_persona(rs.getString("p.tipo"));
				vo.setEmail_persona(rs.getString("p.mail"));
				vo.setDireccion(rs.getString("p.direccion"));
				vo.setTelefono_fijo(rs.getString("p.telefono"));
				vo.setTelefono_celular(rs.getString("p.celular"));
				vo.setSexo(rs.getString("p.sexo"));
				vo.setRuc(rs.getString("p.ruc"));
				vo.setEstado(rs.getString("p.estado"));
				vo.setUsuario_sistema(rs.getString("d.usuariosistema"));
				vo.setPassword(rs.getString("d.password"));
				l.add(vo);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return l;
	}	

public Dueno GenerarCodigo() throws DAOExcepcion {
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		String Cad = "0";
		Integer Num = 0;
		try {
			String query = "Select max(iddueno) as codigo from dueno";
			Dueno dueno = new Dueno();
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()) {
				Cad = rs.getString(1);
				if (Cad == null) {
					Cad = "0000";
				}

			}
			Num = Integer.parseInt(Cad.substring(1, Cad.length()));
			Num = Num + 1;
			String convierte = String.valueOf(Num);
			String codigo = "000" + convierte;
			// codigo=codigo.substring(0, codigo.length());

			if (4 <= codigo.length()) {
				int Inicio = (codigo.length() - 4);
				codigo = codigo.substring(Inicio, codigo.length());
			} else {
				codigo = Cad;
			}
			codigo = "D" + codigo;
			dueno.setCodigo_persona(codigo);

			return dueno;
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}

	}

public Doctor GenerarCodigoDoctor() throws DAOExcepcion {
	Connection con = null;
	PreparedStatement stmt = null;
	ResultSet rs = null;
	String Cad ="0";
	Integer Num = 0;
	try {
		String query = "Select max(iddoctor) as codigo from doctor";
		Doctor doctor = new Doctor();
		con = ConexionBD.obtenerConexion();
		stmt = con.prepareStatement(query);
		rs = stmt.executeQuery();
		if (rs.next()){
			Cad= rs.getString(1);
			if (Cad==null){
				Cad="0000";
			}
		}	
			Num = Integer.parseInt(Cad.substring(1, Cad.length()));
			Num = Num + 1;
			String convierte = String.valueOf(Num);
			String codigo= "000"+ convierte;
//			codigo=codigo.substring(0, codigo.length());
			
	
			 if(4 <=codigo.length()){  
				 int Inicio = (codigo.length() - 4 );   
				 codigo = codigo.substring(Inicio, codigo.length()); 
				 } 
			 else{   
				 codigo = Cad;  			
			 }
			codigo= "U"+codigo;
			doctor.setCodigo_persona(codigo);
		
		 return doctor;
	} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
	} finally {
		this.cerrarResultSet(rs);
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
	}

}

public Collection<Persona> obtenerPorNombreApellido(String nombre, String apellido, String ruc, String estado, String tipo) throws DAOExcepcion {
	Collection<Persona> l = new ArrayList<Persona>();
	
	Connection con = null;
	PreparedStatement stmt = null;
	ResultSet rs = null;
	String query;
	try {
		 
			// System.out.println("En las otras " + tipo);
			query = "SELECT distinct  p.idpersona, p.nombre, p.apellido, p.mail, p.direccion, p.telefono, p.celular, p.sexo," + 
						" p.ruc, p.estado, d.notas, d.imagen" +
					   " FROM persona p INNER JOIN dueno d WHERE " + 
						" p.nombre like '%" + nombre + "%'" + 
						" and p.apellido like '%" + apellido + "%'" +
						" and p.ruc like '%" + ruc + "%'" +
						" and p.estado like '%" + estado + "%'" +
						"  and p.tipo like '%" + tipo + "%' and p.idpersona=d.iddueno group by p.idpersona order by p.idpersona asc";
			
							
		 con = ConexionBD.obtenerConexion();
		stmt = con.prepareStatement(query);
		// stmt.setString(1, codigo_persona);
		rs = stmt.executeQuery();
		while (rs.next()) {
			Persona vo = new Persona();
			
			vo.setCodigo_persona(rs.getString("p.idpersona"));
			vo.setNombre_persona(rs.getString("p.nombre"));
			vo.setApellido_persona(rs.getString("p.apellido"));
			vo.setEmail_persona(rs.getString("p.mail"));
			vo.setDireccion(rs.getString("p.direccion"));
			vo.setTelefono_fijo(rs.getString("p.telefono")); 
			vo.setTelefono_celular(rs.getString("p.celular"));
			vo.setSexo(rs.getString("p.sexo"));
			vo.setRuc(rs.getString("p.ruc"));
			vo.setEstado(rs.getString("p.estado"));
			
			Dueno du = new Dueno();
			
			du.setImagen(rs.getString("d.imagen"));
			du.setNotas(rs.getString("d.notas"));
			vo.setoDueno(du);
			l.add(vo);
		} 
	} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
	} finally {
		this.cerrarResultSet(rs);
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
	}
	return l;
}

public Collection<Persona> obtenerDoctorNombreApellido(String nombre, String apellido, String usuario, String ruc, String estado) throws DAOExcepcion {
	Collection<Persona> l = new ArrayList<Persona>();
	
	Connection con = null;
	PreparedStatement stmt = null;
	ResultSet rs = null;
	String query;
	try {
		 
			// System.out.println("En las otras " + tipo);
			query = "SELECT distinct  p.idpersona, p.nombre, p.apellido, p.mail, p.direccion, p.telefono, p.celular, p.sexo," + 
						" p.ruc, p.estado, d.usuariosistema" +
					   " FROM persona p INNER JOIN doctor d WHERE " + 
						" p.nombre like '%" + nombre + "%'" + 
						" and p.apellido like '%" + apellido + "%'" +
						" and p.ruc like '%" + ruc + "%'" +
						" and p.estado like '%" + estado + "%'" +
						" and d.usuariosistema like '%" + usuario + "%'" +
						" and d.iddoctor=p.idpersona " +
						"  and p.tipo is null group by p.idpersona order by p.idpersona asc";
			
							
		 con = ConexionBD.obtenerConexion();
		stmt = con.prepareStatement(query);
		// stmt.setString(1, codigo_persona);
		rs = stmt.executeQuery();
		while (rs.next()) {
			Persona vo = new Persona();
			
			vo.setCodigo_persona(rs.getString("p.idpersona"));
			vo.setNombre_persona(rs.getString("p.nombre"));
			vo.setApellido_persona(rs.getString("p.apellido"));
			vo.setEmail_persona(rs.getString("p.mail"));
			vo.setDireccion(rs.getString("p.direccion"));
			vo.setTelefono_fijo(rs.getString("p.telefono")); 
			vo.setTelefono_celular(rs.getString("p.celular"));
			vo.setSexo(rs.getString("p.sexo"));
			vo.setRuc(rs.getString("p.ruc"));
			vo.setEstado(rs.getString("p.estado"));
			
			Doctor du = new Doctor();
			
			du.setUsuario_sistema(rs.getString("d.usuariosistema"));
			vo.setoDoctor(du);
			l.add(vo);
		} 
	} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
	} finally {
		this.cerrarResultSet(rs);
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
	}
	return l;
}


public Persona obtenerUsuario(String usuario, String password) throws DAOExcepcion {
	//Persona> l = new ArrayList<Persona>();
	
	Connection con = null;
	PreparedStatement stmt = null;
	ResultSet rs = null;
	String query;
	try {
		  //System.out.println("Dentro");
			// System.out.println("En las otras " + tipo);
			query = "SELECT distinct  p.idpersona, p.nombre, p.estado, p.apellido, d.usuariosistema " + 
					   " FROM persona p INNER JOIN doctor d WHERE " + 
						" d.usuariosistema='" + usuario + "'" +
					    " and d.password='" + password + "'" +
						" and d.iddoctor=p.idpersona";
						
			
							
		 con = ConexionBD.obtenerConexion();
		stmt = con.prepareStatement(query);
		// stmt.setString(1, codigo_persona);
		rs = stmt.executeQuery();
			
		if (rs.next()) {
				Persona vo = new Persona();
				
				vo.setNombre_persona(rs.getString("p.nombre"));
				vo.setApellido_persona(rs.getString("p.apellido"));
				vo.setEstado(rs.getString("p.estado"));
				
				return vo;
		}
		else{
			return null;
			
		} 
	} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
	} finally {
		this.cerrarResultSet(rs);
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
	}
	
}

}

